package zpe.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import zpe.controledeacesso.model.bean.Usuario;
import zpe.genericcrud.model.Entidade;
import zpe.model.enums.Acondicionamento;
import zpe.model.enums.StatusCarga;

@Entity
@Table(name = "tb_carga", schema = "dbo")
public class Carga implements Entidade {


	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "ci_carga")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@Column(name = "nr_codigo",columnDefinition="int")
	private Integer codigo;

	@Enumerated(EnumType.ORDINAL)
	@Column(name = "cd_status",columnDefinition="int")
	private StatusCarga status;

	@OneToMany(mappedBy = "carga", targetEntity = TransportadoraCarga.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
	private List<TransportadoraCarga> transportadoras = new ArrayList<TransportadoraCarga>();

	@OneToOne
	@JoinColumn(name = "cd_proprietario",columnDefinition="int")
	private Cliente proprietario = new Cliente();

	@Enumerated(EnumType.ORDINAL)
	@Column(name = "cd_arcondicionamento",columnDefinition="int")
	private Acondicionamento acondicionamento;

	@Column(name = "ds_regime_aduaneiro")
	private String regimeAduaneiro;

	@Column(name = "dt_entrada")
	private Date entrada;

	@Column(name = "qtd_itens",columnDefinition="int")
	private Integer quantidadeItens;

	@Column(name = "vl_peso_total")
	private Double pesoTotal;

	@Column(name = "vl_volume_total")
	private Double volumeTotal;

	@Column(name = "ds_observacao")
	private String observacao;

	@Column(name = "ds_numero_ce")
	private String numeroCE;

	@Column(name = "ds_numero_bl")
	private String numeroBL;

	@Column(name = "ds_fatura")
	private String fatura;

	@Column(name = "ds_packinglist")
	private String packingList;

	@Column(name = "ds_referencia")
	private String referencia;

	@Column(name = "ds_dta")
	private String DTA;

	@OneToOne(mappedBy = "carga",cascade = CascadeType.ALL)
	private AdmissaoRegime admissaoRegime = new AdmissaoRegime();

	@OneToMany(mappedBy = "carga", targetEntity = ItemCarga.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
	private List<ItemCarga> itens;

	@Column(name = "vl_cubagem")
	private Double cubagem;

	@OneToOne
	@JoinColumn(name = "cd_usuario_cadastro")
	private Usuario usuarioCadastro;

	@Column(name="dt_cadastro")
	private Date dataCadastro;
	
	@OneToOne
	@JoinColumn(name = "cd_usario_alteracao")	
	private Usuario usuarioAlteracao;
	
	@Column(name="dt_alteracao")
	private Date dataAlteracao;
	
	@Column(name="fl_ativo")
	private Character ativo = 'S';

	@OneToMany(mappedBy = "carga", targetEntity = NomeclaturasCarga.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
	private List<NomeclaturasCarga> nomeclaturas = new ArrayList<NomeclaturasCarga>();

	public List<NomeclaturasCarga> getNomeclaturas() {
		return nomeclaturas;
	}

	public void setNomeclaturas(List<NomeclaturasCarga> nomeclaturas) {
		this.nomeclaturas = nomeclaturas;
	}

	public Character getAtivo() {
		return ativo;
	}

	public void setAtivo(Character ativo) {
		this.ativo = ativo;
	}

	public Usuario getUsuarioCadastro() {
		return usuarioCadastro;
	}

	public void setUsuarioCadastro(Usuario usuarioCadastro) {
		this.usuarioCadastro = usuarioCadastro;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Usuario getUsuarioAlteracao() {
		return usuarioAlteracao;
	}

	public void setUsuarioAlteracao(Usuario usuarioAlteracao) {
		this.usuarioAlteracao = usuarioAlteracao;
	}

	public Date getDataAlteracao() {
		return dataAlteracao;
	}

	public void setDataAlteracao(Date dataAlteracao) {
		this.dataAlteracao = dataAlteracao;
	}

	public Double getCubagem() {
		return cubagem;
	}

	public void setCubagem(Double cubagem) {
		this.cubagem = cubagem;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getCodigo() {
		return codigo;
	}

	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	public StatusCarga getStatus() {
		return status;
	}

	public void setStatus(StatusCarga status) {
		this.status = status;
	}

	public List<TransportadoraCarga> getTransportadoras() {
		return transportadoras;
	}

	public void setTransportadoras(List<TransportadoraCarga> transportadoras) {
		this.transportadoras = transportadoras;
	}

	public Cliente getProprietario() {
		return proprietario;
	}

	public void setProprietario(Cliente proprietario) {
		this.proprietario = proprietario;
	}

	public Acondicionamento getAcondicionamento() {
		return acondicionamento;
	}

	public void setAcondicionamento(Acondicionamento arcondicionamento) {
		this.acondicionamento = arcondicionamento;
	}

	public String getRegimeAduaneiro() {
		return regimeAduaneiro;
	}

	public void setRegimeAduaneiro(String regimeAduaneiro) {
		this.regimeAduaneiro = regimeAduaneiro;
	}

	public Date getEntrada() {
		return entrada;
	}

	public void setEntrada(Date entrada) {
		this.entrada = entrada;
	}

	public Integer getQuantidadeItens() {
		return quantidadeItens;
	}

	public void setQuantidadeItens(Integer quantidadeItens) {
		this.quantidadeItens = quantidadeItens;
	}

	public Double getPesoTotal() {
		return pesoTotal;
	}

	public void setPesoTotal(Double pesoTotal) {
		this.pesoTotal = pesoTotal;
	}

	public Double getVolumeTotal() {
		return volumeTotal;
	}

	public void setVolumeTotal(Double volumeTotal) {
		this.volumeTotal = volumeTotal;
	}

	public String getNumeroCE() {
		return numeroCE;
	}

	public void setNumeroCE(String numeroCE) {
		this.numeroCE = numeroCE;
	}

	public String getNumeroBL() {
		return numeroBL;
	}

	public void setNumeroBL(String numeroBL) {
		this.numeroBL = numeroBL;
	}

	public String getFatura() {
		return fatura;
	}

	public void setFatura(String fatura) {
		this.fatura = fatura;
	}

	public String getPackingList() {
		return packingList;
	}

	public void setPackingList(String packingList) {
		this.packingList = packingList;
	}

	public String getReferencia() {
		return referencia;
	}

	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}

	public String getDTA() {
		return DTA;
	}

	public void setDTA(String dTA) {
		DTA = dTA;
	}

	public AdmissaoRegime getAdmissaoRegime() {
		return admissaoRegime;
	}

	public void setAdmissaoRegime(AdmissaoRegime admissaoRegime) {
		this.admissaoRegime = admissaoRegime;
	}

	public List<ItemCarga> getItens() {
		return itens;
	}

	public void setItens(List<ItemCarga> itens) {
		this.itens = itens;
	}

	@Override
	public Map<String, Object> notEmptyFields() {
		
		Map<String, Object> map = new HashMap<String, Object>();

		map.put("ativo", "S");
		
		return map;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Carga other = (Carga) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}
